/*
 * app_key_value.h
 *
 *  Created on: 2023年7月28日
 *      Author: mcealt_DS
 * key_value表RBF端根据产品定义为为固定
 *    RBF         HUB            PANEL
 * ----------------------------------------
 *                  |REC    <-   发起
 *    REC    <- SEND|DONE   ->   完成下发
 *    UPDATE ->  REC|UPDATE ->   完成更新
 */

#ifndef APP_KEY_VALUE_H_
#define APP_KEY_VALUE_H_


#include "stdint.h"
#include "device.h"
#include "stdbool.h"

#define BUFF_KEY_VALUE_SIZE    224  //物模型队列大小
#define APP_KEY_VALUE_NUM_MAX  128  //单个设备最大同时支持物模型个数
#define KEY_VALUE_SIZE_MAX     45   //单个物模型数据最大长度

/*********** 物模型key长度，256用于表示可变长度  ********/
#define APP_KEY_VALUE_SIZE_IS_AVR        0xFF  // KEY_VALUE_SIZE_MAX //Info0430 size无效值最好用申请数组的大小值表示！ 可变长度
#define APP_KEY_VALUE_NULL_SIZE                NULL

#define APP_KEY_VALUE_ID_SPVN_SLOT_TIME_SIZE   4
#define APP_KEY_VALUE_GLOBAL_SLOT_MALLOC_SIZE  APP_KEY_VALUE_SIZE_IS_AVR
#define APP_KEY_VALUE_GROUP_IDX_SIZE           1
#define APP_KEY_VALUE_INIT_PREAMBLE_SET_SIZE   2
#define APP_KEY_VALUE_WHITE_BLACK_CHAN_SIZE    APP_KEY_VALUE_SIZE_IS_AVR
#define APP_KEY_VALUE_LAST_TXD_TIMESTAMP_SIZE  4
#define APP_KEY_VALUE_ADD_SLOT_TYPE_SIZE       APP_KEY_VALUE_SIZE_IS_AVR

#define APP_KEY_VALUE_DEBUG_CRTL_SIZE          APP_KEY_VALUE_SIZE_IS_AVR

#define APP_KEY_VALUE_DEVICE_INFO_SIZE         APP_KEY_VALUE_SIZE_IS_AVR
#define APP_KEY_VALUE_DEBUG_INFO_SIZE          APP_KEY_VALUE_SIZE_IS_AVR

#define APP_KEY_VALUE_INPUT_OUTPUT_SIZE        2
#define APP_KEY_VALUE_IN_OUTPUT_VAR_SIZE       APP_KEY_VALUE_SIZE_IS_AVR
#define APP_KEY_VALUE_TEMP_HUMI_SIZE           4
#define APP_KEY_VALUE_VOLT_C_SIZE              5
#define APP_KEY_VALUE_ID_RUNTIME_SIZE          8
#define APP_KEY_VALUE_ACKCTRLRECVD_SIZE        4
#define APP_KEY_VALUE_BCASTRECVD_SIZE          APP_KEY_VALUE_SIZE_IS_AVR

#define APP_KEY_VALUE_KEY_PRESS_SIZE           1
#define APP_KEY_VALUE_KEY_MULTI_PRESS_SIZE     APP_KEY_VALUE_SIZE_IS_AVR
#define APP_KEY_VALUE_TAG_SCAN_SIZE            8
#define APP_KEY_VALUE_PICTURE_CAPTURE_SIZE     APP_KEY_VALUE_SIZE_IS_AVR

#define APP_KEY_VALUE_OPTION_SIZE              OPTION_LENGTH
#define APP_KEY_VALUE_OPTION_VAR_SIZE          APP_KEY_VALUE_SIZE_IS_AVR

#define APP_KEY_VALUE_COMLEDCTRL_SIZE          LEDCTRL_LENGTH
#define APP_KEY_VALUE_OPERATECTRL_SIZE         OPERATECTRL_LENGTH
#define APP_KEY_VALUE_KEYVALUEGET_SIZE         GETKEYVALUE_LENGTH

//FType +(DeviceType	ModelType	HardType	MAC8	RFVer	sVer)
#define AAPP_KEY_VALUE_ID_FILE_TRANS_REQ_SIZE  APP_KEY_VALUE_SIZE_IS_AVR
/*KEY VALUE MASK*/
#define SOUNDDER_MASK_OPTION                   (0x1F)   //Bit0-4(Option_2)
#define SOUNDDER_MASK_OPERATECTRL              (0XE0)   //Bit5-7(OpreateCtrl_1)
#define KEYPAD_MASK_OPTION                     (0x0F)   //Bit0-3(Option_2)
#define KEYPAD_MASK_FAILURE                    (1<<4) 
#define KEYPAD_MASK_IOEN                       (1<<5) 
#define KEYPAD_MASK_COMLEDCTRL                 (3<<6)   //Bit6-7(comLEDctrl)
#define SWITCH_MASK_OPTION                     (0x03)   //Bit0-1(Option_2)
#define SWITCH_MASK_OPERATECTRL                (0xFC)   //Bit2-Bit7(OpreateCtrl_1)

//错误代码
typedef enum{
  APP_KEY_VALUE_NO_ERR = 0, //没有错误，即正确ok
  APP_KEY_VALUE_ERR_VALUE_LEN,  //数据长度错误
  APP_KEY_VALUE_ERR_VALUE_UNKNOWN,  //数据长度未知
  APP_KEY_VALUE_ERR_ID,     //keyID错误（不支持或不存在）
  APP_KEY_VALUE_ERR_VALUE,  //数据错误
  APP_KEY_VALUE_ERR_NO_DATA, //无数据
  APP_KEY_VALUE_ERR_UNKNOWN, //未知错误，除以上之外的错误
  APP_KEY_VALUE_ERR_FULL,//缓存已满
}app_key_value_err_e;

//KEY表
typedef enum{
  //配置状态输出
  APP_KEY_VALUE_ID_SPVN_SLOT_TIME       = 0x01,
  APP_KEY_VALUE_ID_GLOBAL_SLOT_MALLOC   = 0x02,
  APP_KEY_VALUE_ID_GROUP_IDX            = 0x03,
  APP_KEY_VALUE_ID_INIT_PREAMBLE_SET    = 0x04,
  APP_KEY_VALUE_ID_WHITE_BLACK_CHAN     = 0x05,
  APP_KEY_VALUE_ID_LAST_TXD_TIMESTAMP   = 0x06,
  APP_KEY_VALUE_ID_ADD_SLOT_TYPE        = 0x07,
  //指令操作输出，若通过应答下行必须使用 Aseq 字段 确保可靠传输及过滤重复数据
  APP_KEY_VALUE_ID_DEBUG_CRTL           = 0x0A,
  APP_KEY_VALUE_ID_DEVICE_INFO          = 0x0D,
  APP_KEY_VALUE_ID_DEBUG_INFO           = 0x0F,
  //状态输入
  APP_KEY_VALUE_ID_INPUT_OUTPUT         = 0x10,
  APP_KEY_VALUE_ID_IN_OUTPUT_VAR        = 0x11,
  APP_KEY_VALUE_ID_TEMP_HUMI            = 0x12,
  APP_KEY_VALUE_ID_VOLT_C               = 0x13,
  APP_KEY_VALUE_ID_RUNTIME              = 0x14,
  APP_KEY_VALUE_ID_ACKCTRLRECVD         = 0x2E,
  APP_KEY_VALUE_ID_BCASTRECVD           = 0x2F,
  //操作输入
  APP_KEY_VALUE_ID_KEY_PRESS            = 0x30,
  APP_KEY_VALUE_ID_KEY_MULTI_PRESS      = 0x31,
  APP_KEY_VALUE_ID_TAG_SCAN             = 0x32,
  APP_KEY_VALUE_ID_PICTURE_CAPTURE      = 0x3A,
  APP_KEY_VALUE_ID_UPDATEME             = 0X4F,
  //配置状态输出，配置外设所处的状态，如开、关，亮、灭等状态，以及其他配置参数
  APP_KEY_VALUE_ID_OPTION               = 0x50,
  APP_KEY_VALUE_ID_OPTION_VAR           = 0x51,
  //指令操作输出，若通过应答下行必须使用 Aseq 字段 确保可靠传输及过滤重复数据，并
  //同时直接自动修改 OPTION 相应的状态量
  APP_KEY_VALUE_ID_COMLED_CTRL          = 0x60,
  APP_KEY_VALUE_ID_OPERATE_CTRL         = 0x61,
  APP_KEY_VALUE_ID_KEY_VALUE_GET        = 0x70,
  //调试字段
  APP_KEY_VALUE_ID_PLUG_DEBUG_DATA      = 0xE0,
  //文件传输
  APP_KEY_VALUE_ID_FILE_CHECK_RET       = 0xFB,
  APP_KEY_VALUE_ID_FILE_TRANS_CONFIRM   = 0xFD,
  APP_KEY_VALUE_ID_FILE_TRANS_ACCEPT    = 0xFE,
  APP_KEY_VALUE_ID_FILE_TRANS_REQ       = 0xFF,
}KEY_VALUE_ID_E;


//key-value 一般结构体
typedef struct 
{
    KEY_VALUE_ID_E id;
    uint8_t valueSize;
    uint8_t value[KEY_VALUE_SIZE_MAX];
}keyValue_t;

// 检查ID是否存在
app_key_value_err_e checkKeyId(KEY_VALUE_ID_E kedId);
// get物模型数据长度
uint8_t get_key_value_size(KEY_VALUE_ID_E kedId);

/*
 *物模型队列初始化
 */
void app_key_value_init(void);

/*
 * 生产物模型(HUB RFM都支持)
 * 输入：keyValue   单个物模型
 * 输出：结果
 */
app_key_value_err_e set_key_value(const keyValue_t *keyValue);

/*
 * 消费物模型(HUB RFM都支持)
 * 输入：keyValue   单个物模型
 * 输出：结果
 */
app_key_value_err_e get_key_value(keyValue_t *keyValue);

bool is_buff_key_value_down_empty(void);

bool is_buff_key_value_up_empty(void);
/*
* 物模型解报:生产物模型队列(HUB RFM都支持)
* 输入：keyValue_packet       报文指针
        keyValue_packet_size
* 输出：结果
*/

app_key_value_err_e app_key_value_unpack(uint8_t *keyValue_packet, uint16_t keyValue_packet_size);
/*
* 物模型组报(HUB RFM都支持)
* 输入：keyValue_packet       报文指针
        keyValue_packet_size  
* 输出：结果
*/
app_key_value_err_e app_key_value_pack(uint8_t *keyValue_packet, uint16_t *keyValue_packet_size);

#endif /* APP_KEY_VALUE_H_ */
